[AWS] CloudFormationでAWSの複数サービスを簡単に立ち上げてみる
こんにちは。三上です。
今年の冬は寒くなると聞いて、ビクビクな毎日です。。(寒いのやだなあ。。。
やりたいこと
- AWS EC2とS3とRedshiftを簡単に立ち上げたい
- 同じサービス構成を何回も簡単に作りたい
- 誰が作業しても同じ環境ができるようにしたい
- 自分が立ち上げた全部のサービスを忘れずに破棄できるようにしたい
→
shellスクリプトからAWS CLIでCloudFormationのスタックを作って、 CloudFormationにEC2+S3+Redshiftをつくってもらおう!
※作業者はshellスクリプトを実行するだけでOK!
準備するもの
1. AWS IAM(Identity and Access Management)ユーザー
IAMユーザー作成後、アクセスキーとシークレットキーを取得します。
2. AWS CLI(Command Line Interface)
インストール後、取得した認証情報を設定します。
今回は、認証情報にprofileオプションを指定します。
$ aws configure --profile mikami AWS Access Key ID [********************]: AWS Secret Access Key [********************]: Default region name [ap-northeast-1]: Default output format :
3. shell実行環境
Windowsの場合は、shellを実行できる環境にしておきます。
Unixコマンドツール Gowをインストールしました。
やってみよう
1. AWS CloudFormationのテンプレートを作成
CloudFormationにつくってもらいたいEC2、S3、Redshiftを、テンプレートに定義します。
ですがこのテンプレート、どこに何を書けばよいのかよく分からない。。
json(またはYAML)形式なのでサンプル見てみてもいまいちピンとこない。。
そこで、AWS CloudFormationデザイナーを使います。
テンプレートをグラフィカルに作成&カスタマイズ可能(分かりやすい!v
操作や編集箇所については、こちらを参照しました。
AWSのサンプルテンプレートページの「View in Designer」リンクから、サンプルテンプレートをカスタマイズできます。
今回は、こんな環境を作成します。
2.shellスクリプトを作成
AWS CLIでCloudFormationのスタックをcreateするshellスクリプトを書きます。
- 設定ファイル
PROFILE=mikami STACK_NAME=cm-mikami-test TEMPLATE_NAME=template.json
- shellスクリプト
#!/bin/bash echo "Start Create Instances..." source `dirname $0`/stack_info.cnf aws --profile $PROFILE cloudformation create-stack \ --region ap-northeast-1 \ --stack-name $STACK_NAME \ --template-body file://$TEMPLATE_NAME \ --capabilities CAPABILITY_IAM AWS_CF_RET=$? if [[ $AWS_CF_RET -ne 0 ]]; then echo "[ERROR]CloudFormation create error." >&2 exit 1 fi aws --profile $PROFILE cloudformation wait stack-create-complete --stack-name $STACK_NAME AWS_CF_RET=$? if [[ $AWS_CF_RET -ne 0 ]]; then echo "[ERROR]CloudFormation wait error." >&2 exit 1 fi echo "Stack created." REDSHIFT_ENDPOINT=`aws --profile $PROFILE cloudformation describe-stacks --stack-name $STACK_NAME | jq -r '.Stacks[].Outputs[] | select(.OutputKey == "ClusterEndpoint") | .OutputValue'` ELASTIC_IP=`aws --profile $PROFILE cloudformation describe-stacks --stack-name $STACK_NAME | jq -r '.Stacks[].Outputs[] | select(.OutputKey == "EC2ElasticIp") | .OutputValue'` echo -e "{\n \"RedshiftEndPoint\": \"$REDSHIFT_ENDPOINT\",\n \"Ec2ElasticIP\": \"$ELASTIC_IP\"\n}" echo -e "{\n \"RedshiftEndPoint\": \"$REDSHIFT_ENDPOINT\",\n \"Ec2ElasticIP\": \"$ELASTIC_IP\"\n}" > access_info.txt echo "fin."
3. shellスクリプトを実行
$ ./create.sh
待ちます(どきどき →shellの実行が終わったら、きちんとサービスができているか確認してみます。
- EC2
・管理コンソール
・TeraTermで接続 →できてるv
- S3
・管理コンソール →よしよしv
- Redshift
・管理コンソール
・コマンドラインから接続してみる →ちゃんとつながったー!
お片付け
CloudFormationのスタックを削除するshellスクリプトを作っておけば、作成したサービスの破棄も簡単。
#!/bin/bash echo "Start Delete Instances..." source `dirname $0`/stack_info.cnf # delete stack aws --profile $PROFILE cloudformation delete-stack --stack-name $STACK_NAME AWS_CF_RET=$? if [[ $AWS_CF_RET -ne 0 ]]; then echo "[ERROR]CloudFormation delete error." >&2 exit 1 fi echo "waiting.." aws --profile $PROFILE cloudformation wait stack-delete-complete --stack-name $STACK_NAME AWS_CF_RET=$? if [[ $AWS_CF_RET -ne 0 ]]; then echo "[ERROR]CloudFormation wait error." >&2 exit 1 fi echo "fin."
スクリプト実行で、全部きれいになくなります。
$ ./terminate.sh
まとめ(所感)
- CloudFormationってすごい!
テンプレートファイルをバージョン管理しておけばサービス構成を管理できるし、いつでもすぐに同じ環境を構築可能!
CloudFormationをterminateすれば、作ったサービスも一緒に消してくれるので、後片付けもらくちんv
- 夢がふくらむ
shellたたくだけでいいので、人の手を介さないでも実行できる。
jobスケジューラーから実行したり、Jenkinsさんにたたいてもらえば、何かいろいろ自動化できそうv